package com.zhangye.test.service;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.multipart.MultipartFile;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.zhangye.test.entity.EasyArResult;
import com.zhangye.test.entity.Results;
import com.zhangye.test.entity.SimilarResult;
import com.zhangye.test.mapper.ArCommentMapper;
import com.zhangye.test.mapper.CategoryMapper;
import com.zhangye.test.mapper.CompanyMapper;
import com.zhangye.test.mapper.InfomationMapper;
import com.zhangye.test.mapper.InterviewMapper;
import com.zhangye.test.mapper.ProxyArMapper;
import com.zhangye.test.mapper.RegionMapper;
import com.zhangye.test.mapper.ScanCountMapper;
import com.zhangye.test.mapper.SearchLogMapper;
import com.zhangye.test.model.Admin;
import com.zhangye.test.model.Infomation;
import com.zhangye.test.model.Interview;
import com.zhangye.test.model.ProxyAr;
import com.zhangye.test.util.AddressUtil;
import com.zhangye.test.util.ImageURLgetBase64;
import com.zhangye.test.util.JPushController;
import com.zhangye.test.util.MatrixToImageWriter;
import com.zhangye.test.util.PageInfo;
import com.zhangye.test.util.Result;
import com.zhangye.test.util.cloudUtils;

/**
 * proxyAr
 * 作者： 张叶
 * 创建时间：2018年5月11日  上午11:56:04
 */
@Service
public class ProxyArService {
	
	@Autowired
	private ProxyArMapper proxyArMapper;
	@Autowired
	private QiniuService qiniuService;
	@Autowired
	private CompanyMapper companyMapper;
	@Autowired
	private InterviewMapper interviewMapper;
	@Autowired
	private ArCommentMapper arCommentMapper;
	@Autowired
	private ScanCountMapper scanCountMapper;
	@Autowired
	private AdminService adminService;
	@Autowired
	private SearchLogMapper searchLogMapper;
	@Autowired
	private InfomationMapper infomationMapper;
	@Autowired
	private RegionMapper regionMapper;
	@Autowired
	private CategoryMapper categoryMapper;

	
	/**
	 * 添加
	 * 1，检测相似度
	 * 2，添加
	 * 作者： 张叶
	 * 创建时间：2018年8月23日  上午9:16:55
	 */
	public int proxyInsert (ProxyAr pa) throws Exception{
		//上传七牛云
		int flag = 1;
		SimilarResult sr = cloudUtils.similarCloud(ImageURLgetBase64.getBase64(pa.getImageUrl()));
		List<Results> list = sr.getSimilar().getResults();
		if(list.size() == 0){//无相似图片
			//添加proxyAr云
			EasyArResult er = cloudUtils.addClouds(ImageURLgetBase64.getBase64(pa.getImageUrl()), pa.getName(), 20, encode(pa.getVideoUrl().getBytes()));
			if(er != null && !"".equals(er)){
				String status = er.getStatusCode();
				if(status.equals("0")){//添加成功，入库
					pa.setTargetId(er.getResult().getTargetId());
					pa.setActive(er.getResult().getActive());
					pa.setCreateAt(new Date());
					pa.setStatus("audit");
					if(proxyArMapper.insert(pa) > 0){
						flag = 0;//推送
						JPushController.aliasPush("新代理视频添加，请尽快压缩");//代理视频推送
					}
					if(flag != 0){
						cloudUtils.removeClouds(er.getResult().getTargetId());
					}
				}
			}
		}else{
			flag = 2;
		}
		return flag;
	}
	
	
	/**
	 * 修改参数
	 * 作者： 张叶
	 * 创建时间：2018年8月31日  下午2:03:29
	 */
	public int updateNormal(ProxyAr pa){
		int flag = proxyArMapper.updateByPrimaryKey(pa);
		return flag;
	}


	/**
	 * 修改图片
	 * 检查相似度，
	 * 作者： 张叶
	 * 创建时间：2018年8月28日  上午10:43:47
	 * @throws Exception 
	 * @throws IOException 
	 */
	@Transactional
	public int updateVideoUrl(Long proxyArId, MultipartFile trackingImage) throws Exception {
		int i = 0;
		ProxyAr pa = proxyArMapper.selectByPrimaryKey(proxyArId);
		if(pa != null && !"".equals(pa)){
			String videoUrl = qiniuService.upload("file", trackingImage.getOriginalFilename(),trackingImage.getBytes());
			EasyArResult er = cloudUtils.updateVideoUrl(pa.getTargetId(),encode(videoUrl.getBytes()));
			if(er != null && !"".equals(er)){
				String status = er.getStatusCode();
				if(status.equals("0")){//添加成功，入库
					pa.setVideoUrl(videoUrl);
					i = proxyArMapper.updateByPrimaryKey(pa);
					if(i == 0){
						TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
					}
				}
			}
		}
		return i;
	}


	/**
	 * 修改图片
	 * 检查相似度，
	 * 作者： 张叶
	 * 创建时间：2018年8月28日  上午10:43:47
	 * @throws Exception 
	 * @throws IOException 
	 */
	@Transactional
	public int updateImageUrl(Long proxyArId, MultipartFile trackingImage) throws Exception {
		int i = 0;
		SimilarResult sr = cloudUtils.similarCloud(encode(trackingImage.getBytes()));
		List<Results> list = sr.getSimilar().getResults();
		if(list.size() == 0){//无相似图片  encode(imageUrl.getBytes()
			ProxyAr pa = proxyArMapper.selectByPrimaryKey(proxyArId);
			if(pa != null && !"".equals(pa)){
				String imageUrl = qiniuService.upload("file", trackingImage.getOriginalFilename(),trackingImage.getBytes());
				EasyArResult er = cloudUtils.updateImageUrl(pa.getTargetId(),encode(trackingImage.getBytes()));
				if(er != null && !"".equals(er)){
					String status = er.getStatusCode();
					if(status.equals("0")){//添加成功，入库
						pa.setImageUrl(imageUrl);
						pa.setActive(1);
						i = proxyArMapper.updateByPrimaryKey(pa);
						if(i == 0){
							TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
						}
					}
				}
			}
		}
		return i;
	}

	
	/**
	 * 查找
	 * 作者： 张叶
	 * 创建时间：2018年5月23日  上午9:05:58
	 */
	public ProxyAr selectByPrimaryKey(Long id ){
		ProxyAr pa= proxyArMapper.selectByPrimaryKey(id);
		return pa;
	}
	
	@Transactional
	public ProxyAr selectInfoById(Long id,String uuid,Admin admin){
		ProxyAr pa = proxyArMapper.selectInfoById(id);
		
		if(admin != null && !"".equals(admin)){
			String wheres = " and admin_id = " + admin.getId() + " and type = 'give' and easy_ar_id = " + id;
			List<Infomation> lists = infomationMapper.selectByWhere(wheres);
			if(lists.size() > 0){
				pa.setRemark("1");
			}
		}
		
		//添加页面访问次数
		String where = " and easy_ar_id = " + id + " and telphone_uuid = '" + uuid + "'  and  TO_DAYS(created_at) = TO_DAYS(NOW())";
		List<Interview> list = interviewMapper.selectByWhere(where);
		if(list.size() == 0){
			Interview iv = new Interview();
			iv.setCreatedAt(new Date());
			iv.setEasyArId(id);
			iv.setTelphoneUuid(uuid);
			interviewMapper.insert(iv);
		}
		
		return pa;
	}
	
	public List<ProxyAr> selectAll(){
		List<ProxyAr> list = proxyArMapper.selectAll();
		return list;
	}
	
	
	public List<ProxyAr> selectByWhere(String where){
		List<ProxyAr> list = proxyArMapper.selectByWhere(where);
		return list;
	}

	
	/**
	 * 列表
	 * 作者： 张叶
	 * 创建时间：2018年5月23日  上午9:05:40
	 */
	public List<Map<String,Object>> selectByPage(PageInfo pageInfo, String where, String order) {
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("myCount", pageInfo.getCount());
		param.put("pageSize", pageInfo.getPageSize());
		param.put("page", pageInfo.getPage());
		param.put("where", where);
		param.put("order", order);
		List<Map<String, Object>> m = proxyArMapper.selectByPage(param);
		pageInfo.setCount(Integer.parseInt(param.get("myCount").toString()));
		return m;
	}
	
	
	/**
	 * 添加
	 * 1，检测相似度
	 * 2，添加
	 * 作者： 张叶
	 * 创建时间：2018年8月23日  上午9:16:55
	 */
	public int insert (ProxyAr pa, MultipartFile trackingImage) throws Exception{
		//上传七牛云
		int flag = 1;
		SimilarResult sr = cloudUtils.similarCloud(encode(trackingImage.getBytes()));
		List<Results> list = sr.getSimilar().getResults();
		if(list.size() == 0){//无相似图片
			String imageUrl = qiniuService.upload("file", trackingImage.getOriginalFilename(),trackingImage.getBytes());
			//添加proxyAr云
			EasyArResult er = cloudUtils.addClouds(encode(trackingImage.getBytes()), pa.getName(), 20, encode(pa.getVideoUrl().getBytes()));
			if(er != null && !"".equals(er)){
				String status = er.getStatusCode();
				if(status.equals("0")){//添加成功，入库
					flag = insertProxyAr(pa, flag, imageUrl, er);
					if(flag != 0){
						cloudUtils.removeClouds(er.getResult().getTargetId());
					}
				}
			}
		}else{
			flag = 2;
		}
		return flag;
	}


	/**
	 * 添加proxyAr
	 * 作者： 张叶
	 * 创建时间：2018年8月23日  上午9:18:23
	 */
	private int insertProxyAr(ProxyAr pa, int flag, String imageUrl,
			EasyArResult er) {
		ProxyAr proxyar = new ProxyAr();
		proxyar.setTargetId(er.getResult().getTargetId());
		proxyar.setImageUrl(imageUrl);
		proxyar.setName(pa.getName());
		proxyar.setVideoUrl(pa.getVideoUrl());
		proxyar.setActive(er.getResult().getActive());
		proxyar.setCreateAt(new Date());
		proxyar.setAdminId(pa.getAdminId());
		proxyar.setStatus("on");
		if(proxyArMapper.insert(proxyar) > 0){
			flag = 0;
		}
		return flag;
	}	

	
	/**
	 * 获取经纬度
	 * 作者： 张叶
	 * 创建时间：2018年8月23日  上午9:18:35
	 */
	public String getAddress(String lat, String lng) {
		String region = "";
		try {
			region = AddressUtil.getRegionByLocation(String.format("%s,%s", lng, lat));
		} catch (Exception e) {
			region = "河北省石家庄市";
		}
		return region;
	}
	
	/**
	 * 转Base64
	 * 作者： 张叶
	 * 创建时间：2018年5月15日  下午2:11:11
	 */
	public static String encode(final byte[] bytes) {  
		return new String(Base64.encodeBase64(bytes));  
	}	
	
	
	/**
	 * 删除
	 * 1，删除EasyAR
	 * 2，删除数据库表
	 * 3，删除评论
	 * 4，删除扫描
	 * 作者： 张叶
	 * 创建时间：2018年5月16日  上午10:00:37
	 * @throws Exception 
	 */
	@Transactional
	public int deleted(Long id) throws Exception{
		int flag = 0;
		ProxyAr pa = proxyArMapper.selectByPrimaryKey(id);
		cloudUtils.removeClouds(pa.getTargetId());
		//删除视频
		pa.setStatus("deleted");
		flag = proxyArMapper.updateByPrimaryKey(pa);
		return flag;
	}
	
	
	/**
	 * 修改
	 * 作者： 张叶
	 * 创建时间：2018年5月23日  上午10:11:26
	 */
	public int update(ProxyAr pa){
		int flag = 1;
		ProxyAr old = proxyArMapper.selectByPrimaryKey(pa.getId());
		if(old.getName().equals(pa.getName()) && old.getActive().equals(pa.getActive())){
			if(proxyArMapper.updateByPrimaryKey(pa) > 0){
				flag = 0;
			}
		}else{
			EasyArResult er = cloudUtils.updateCloud(pa.getTargetId(),pa.getActive().toString(),pa.getName());
			if(er != null && !"".equals(er)){
				String status = er.getStatusCode();
				if(status.equals("0")){//修改成功，改库
					ProxyAr proxyar = proxyArMapper.selectByPrimaryKey(pa.getId());
					proxyar.setName(pa.getName());
					proxyar.setActive(pa.getActive());
					if(proxyArMapper.updateByPrimaryKey(proxyar) > 0){
						flag = 0;
					}
				}
			}
		}
		return flag;
	}
	
	
	/**
	 * 添加
	 * 作者： 张叶
	 * 创建时间：2018年7月3日  下午3:57:17
	 */
	public int insert(ProxyAr pa){
		pa.setStatus("audit");
		int i = proxyArMapper.insert(pa);
		return i;
	}
	
	/**
	 * 列表
	 * 作者： 张叶
	 * 创建时间：2018年5月23日  上午9:05:40
	 */
	public List<Map<String,Object>> selectByPageApi(PageInfo pageInfo, String where, String order,String lat,String lng) {
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("myCount", pageInfo.getCount());
		param.put("pageSize", pageInfo.getPageSize());
		param.put("page", pageInfo.getPage());
		param.put("where", where);
		param.put("order", order);
		param.put("lat", lat);
		param.put("lng", lng);
		List<Map<String, Object>> m = proxyArMapper.selectByPageApi(param);
		pageInfo.setCount(Integer.parseInt(param.get("myCount").toString()));
		return m;
	}
	
	
	public int updateRecommend(ProxyAr pa){
		int flag = proxyArMapper.updateByPrimaryKey(pa);
		return flag;
	}
	
	
	/**
	 * 审核通过
	 * 1，修改status为on
	 * 2，修改active为1
	 * 作者： 张叶
	 * 创建时间：2018年9月6日  下午3:19:33
	 */
	public int auditProxyAr(Long id,Admin a){
		int flag = 1;
		ProxyAr pa = proxyArMapper.selectByPrimaryKey(id);
		if(pa != null && !"".equals(pa)){
			pa.setActive(1);
			pa.setStatus("on");
			if(a != null && !"".equals(a)){
				pa.setAuditAdminId(a.getId());	
			}
			pa.setAuditDate(new Date());
			EasyArResult er = cloudUtils.updateCloud(pa.getTargetId(),pa.getActive().toString(),pa.getName());	
			if(er != null && !"".equals(er)){
				String status = er.getStatusCode();
				if(status.equals("0")){//修改成功，改库
					if(proxyArMapper.updateByPrimaryKey(pa) > 0){
						flag = 0;
					}
				}
			}
		}
		
		return flag;
	}
	
	
	public Result createQrCode(Long id){
		Result result = new Result();
		ProxyAr p = proxyArMapper.selectByPrimaryKey(id);
		if(p != null && !"".equals(p)){
			p.setQrCode("https://ar.zhyell.com/api/QrCode/create/" + id);
			if(proxyArMapper.updateByPrimaryKey(p) > 0){
				result.code = 0;
				result.message = "生成成功";
			}else{
				result.code = 1;
				result.message = "系统错误，生成失败";
			}
		}else{
			result.code = 2;
			result.message = "该记录或已删除，请重试";
		}
		return result;
	}
}
